接續昨天的 Create 頁面,今天要完成圖片上傳和預覽的功能
圖片上傳到資料庫的方法據我所知有兩種方法:
這邊以第二種方法為例,直接把圖片轉成二進位存進資料庫
前端會用 <input type="file" name="myimg" />
作為圖片檔案上傳的欄位
( 如果是用表單<form>
的話,要注意編碼為 enctype="multipart/form-data"
,才能正確上傳檔案 )
<div class="form-group">
<label asp-for="Image" class="control-label"></label>
<input type="file" name="myimg" id="myimg" class="form-control-file">
<span asp-validation-for="Image" class="text-danger"></span>
</div>
後端用 IFormFile myimg
來接收欄位的檔案,並且用 MemoryStream.ToArray() 把檔案轉成位元組陣列,
詳細用法如下:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Product product, IFormFile myimg)
{
if (ModelState.IsValid)
{
if (myimg != null)
{
using (var ms = new MemoryStream())
{
myimg.CopyTo(ms);
product.Image = ms.ToArray();
}
}
_context.Add(product);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ViewData["Categories"] = new SelectList(
_context.Set<Category>(), "Id", "Name", product.CategoryId);
return View(product);
}
圖片預覽是一讀取到檔案就要在前端動態呈現的
所以這邊會需要用上javascript來實現預覽圖片的功能
並用一個<img>
欄位來顯示預覽的圖片
<img id="preview" style="max-height:200px;" />
<script>
$('#myimg').on('change', function (e) {
const file = this.files[0];
const objectURL = URL.createObjectURL(file); // 使用 createObjectURL 產生圖片url
$('#preview').attr('src', objectURL);
});
</script>
最後看一下成果
請問圖片無法存入資料庫欄位,是什麼原因呢?有少寫程式或是設定缺漏嗎?
另外,圖片預覽要加以下程式才能正常。<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
感謝補充!jQuery 在 MVC 專案建立的時候會自動加入,所以忽略掉了
無法存入資料庫是程式有報錯嗎? 還是存入後變成null?
如果是用表單<form>
的話,要注意編碼為 enctype="multipart/form-data"
<form asp-action="Create" enctype="multipart/form-data">
</form>
對,試過之後是這個原因沒錯。
這裏的Image name是myimg, 類別檔裏又用Image,送出後變成類別檔裏的byte[] Image沒有資料可以收
<div class="form-group">
<label asp-for="Image" class="control-label"></label>
<input type="file" name="myimg" id="myimg" class="form-control-file">
<span asp-validation-for="Image" class="text-danger"></span>
</div>
if (ModelState.IsValid) 這裏測了要加if (!ModelState.IsValid)不然[Image]一開始沒有值進不了,但進了後,若沒有上傳檔案
_context.Add(product);
await _context.SaveChangesAsync();
會出現,因為image資料庫欄不允許null
這裏要加入時又會出現因為image沒有值,而image在資料庫自動開出來的又是varbinary(MAX)的欄位,所以存入的是0x89504E470D0A1A0A0000000D4948445200000....